package com.example.mapleleaf.ui.fragment

import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.CountDownTimer
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.mapleleaf.R
import com.example.mapleleaf.ui.login.Login
import com.example.mapleleaf.ui.recycler.Msg
import com.example.mapleleaf.ui.recycler.MsgAdapter
import kotlinx.android.synthetic.main.fragment_one_view_1.*
import kotlinx.android.synthetic.main.fragment_three.*
import kotlinx.android.synthetic.main.fragment_two.*

/**
 * 这是一个简单的Fragment子类。它用于展示特定的UI和处理相关的交互逻辑，
 */
@Suppress("UNREACHABLE_CODE")
class TwoFragment : Fragment() {
    // TODO: Rename and change types of parameters
    // 存储传递给Fragment的参数，初始化为null，在onCreate方法中从Bundle中获取实际值
    private var param1: String? = null
    private var param2: String? = null

    // 用于存储消息列表，这里的Msg应该是自定义的消息类，这个列表将用于在RecyclerView中显示消息
    private val msgList = ArrayList<Msg>()
    // 用于将消息列表适配到RecyclerView的适配器，延迟初始化
    private lateinit var adapter: MsgAdapter

    /**
     * 在Fragment创建时调用，用于获取传递给Fragment的参数
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 从savedInstanceState中获取参数，如果不为空则设置param1和param2的值
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    /**
     * 创建并返回与该Fragment关联的视图层次结构。这里是从指定的布局文件中加载视图
     */
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment，加载fragment_two布局文件作为Fragment的视图
        return inflater.inflate(R.layout.fragment_two, container, false)
    }

    /**
     * 当与Fragment关联的Activity的onCreate方法执行完毕后调用，在这里进行一些初始化操作
     */
    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        // 初始化消息列表
        initMsg()
        // 创建一个线性布局管理器，用于管理RecyclerView中项目的排列方式，这里使用的是垂直方向的线性布局
        val layoutManager = LinearLayoutManager(context)
        // 将布局管理器设置给RecyclerView，这样RecyclerView就知道如何排列它的子项了
        recyclerview.layoutManager = layoutManager
        // 如果适配器尚未初始化，则创建一个新的MsgAdapter，并将消息列表传递给它
        if (!::adapter.isInitialized) {
            adapter = MsgAdapter(msgList)
        }
        // 将适配器设置给RecyclerView，这样RecyclerView就可以根据适配器中的数据来显示内容了
        recyclerview.adapter = adapter
        // 在Activity中查找名为"send"的按钮，这里使用了强制类型转换（应该确保类型安全）
        val send: Button = activity!!.findViewById<View>(R.id.send) as Button
        // 为"send"按钮设置点击监听器，当按钮被点击时，会调用onClick方法
        send.setOnClickListener {
            onClick(send)
        }

    }

    /**
     * 处理按钮点击事件的方法，这里根据点击的视图进行不同的操作，目前只处理了"send"按钮的点击
     */
    private fun onClick(v: View?) {
        when (v) {
            send -> {
                // 获取输入框中的文本内容
                val content = inputText.text.toString()
                // 如果输入内容不为空
                if (content.isNotEmpty()) {
                    // 创建一个新的消息对象，类型为已发送（这里假设Msg.TYPE_SENT表示已发送类型）
                    val msg = Msg(content, Msg.TYPE_SENT)
                    // 将新消息添加到消息列表中
                    msgList.add(msg)
                    adapter.notifyItemInserted(msgList.size - 1) // 当有新消息时，刷新RecyclerView中的显示
                    recyclerview.scrollToPosition(msgList.size - 1)  // 将 RecyclerView定位到最后一行
                    inputText.setText("") // 清空输入框中的内容
                }
            }
        }
    }

    /**
     * 初始化消息列表的方法，目前为空，可根据需求添加初始化消息的逻辑，比如添加一些默认消息
     */
    private fun initMsg() {
    }

    companion object {
        /**
         * 这是一个工厂方法，用于创建TwoFragment的新实例，并传递参数。
         * 这种方式可以方便地创建Fragment实例并传递必要的数据。
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment TwoFragment.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            TwoFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }
}